package New;


import org.junit.Test;

import java.util.Comparator;
import java.util.function.Consumer;

/**
 * Lambda表达式的作用
 * 1.格式：
 * ->:lambda操作符 或箭头操作符
 * ->左边：lambda形参列表  (其实就是接口中的抽象方法的形参列表)
 * ->右边：lambda体    (其实就是重写的抽象方法的方法体)
 * 2.lambda的6种使用情况
 * 3.lambda的本质：作为接口的实例
 * 4.如果一个接口中，只声明了一个抽象方法，则称此接口为函数式接口
 */
public class lambdaTest1 {
    //    1.无参，无返回值
    @Test
    public void test1() {
        Runnable r1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("世间哪得双全法");
            }
        };
        r1.run();
        System.out.println("***********");
        Runnable r2 = () -> {
            System.out.println("不负如来不负卿");
        };
        r2.run();
    }

    //   2.有1个参数，无返回值
    @Test
    public void test2() {
        Consumer<String> con = new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        };
        con.accept("但曾相见便相知");
        System.out.println("**********");
        Consumer<String> con1 = (String s) -> {
//   3.数据类型可以省略，因为可以由编译器推断得出，称为：“类型推断”
//            Consumer<String> con1 = (s)->{
//    4.只有一个参数时，参数的小括号可以省略
//            Consumer<String> con1 = s->{
            System.out.println(s);
        };
        con1.accept("相见何如不见时");
    }

    //    5.lambda 需要两个或以上参数，多条执行语句，并且可以有返回值
    @Test
    public void test3() {
        Comparator<Integer> com1 = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                System.out.println(o1);
                System.out.println(o2);
                return o1.compareTo(o2);
            }
        };
        System.out.println(com1.compare(12, 6));
        System.out.println("******************");
        Comparator<Integer> com2 = (o1, o2) -> {
            System.out.println(o1);
            System.out.println(o2);
            return o1.compareTo(o2);
        };
        System.out.println(com2.compare(12, 16));
    }

    //    6.lambda体只有一条语句时，return与大括号若有，都可以省略
    @Test
    public void test4() {
        Comparator<Integer> com1 = (o1, o2) -> {
            return o1.compareTo(o2);
        };
        System.out.println(com1.compare(12, 6));
        System.out.println("*************");
//        Comparator<Integer> com2 = Comparator.naturalOrder();//都是可以的
//        Comparator<Integer> com2 = Integer::compareTo;//这个也是对的
        Comparator<Integer> com2 = (o1, o2) -> o1.compareTo(o2);//省略了return，{}
        System.out.println(com2.compare(12, 20));
    }
}
